# -*- coding: UTF-8 -*-

# @Time : 2020/8/12 10:27 

# @Author : litao

# @File : LoggerUtil.py
import logging
from logging import handlers
import os
import time

logger = logging.getLogger('')
logger.setLevel('DEBUG')
class LoggerUtil(object):
    level_relations = {
        'debug':logging.DEBUG,
        'info':logging.INFO,
        'warning':logging.WARNING,
        'error':logging.ERROR,
        'crit':logging.CRITICAL
    }#日志级别关系映射
    def __init__(self,filename,level='info',when='H',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)#设置日志格式
        self.logger.setLevel(self.level_relations.get(level))#设置日志级别
        sh = logging.StreamHandler()#往屏幕上输出
        sh.setFormatter(format_str) #设置屏幕上显示的格式
        th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount)#往文件里写入#指定间隔时间自动生成文件的处理器
        #fh = logging.FileHandler(filename=filename, encoding="utf-8")
        #实例化TimedRotatingFileHandler
        #interval是时间间隔，backupCount是备份文件的个数，如果超过这个个数，就会自动删除，when是间隔的时间单位，单位有以下几种：
        # S 秒
        # M 分
        # H 小时、
        # D 天、
        # W 每星期（interval==0时代表星期一）
        # midnight 每天凌晨
        th.suffix = "%Y%m%d%H.log"  # 设置 切分后日志文件名的时间格式 默认 filename+"." + suffix 如果需要更改需要改logging 源码
        th.setFormatter(format_str)#设置文件里写入的格式
        self.logger.addHandler(sh) #把对象加到logger里
        self.logger.addHandler(th)

    @staticmethod
    def produce_stop_bat(pid, root_path, tmpfile="stop_xxx.bat"):
        # 待写入内容
        stop_cmd = 'taskkill /pid ' + str(pid) + ' /f'  # 关闭指定进程
        del_self_cmd = "del %0"  # 删除自身文件
        # 文件路径和名称 os.path.dirname(os.path.realpath(__file__))
        tmp_all = os.path.join(root_path, "stop_" + tmpfile + ".bat")
        # 写入文件
        with open(file=tmp_all, mode="w") as f:
            f.write(stop_cmd + "\n" + del_self_cmd)

    @staticmethod
    def outputlog(log_path, myfilename):
        main_log_handler = logging.FileHandler(log_path +
                                               "/BOMjson_%s.log" % time.strftime("%Y-%m-%d",
                                                                                 time.localtime(time.time())),
                                               mode="w+",
                                               encoding="utf-8")
        main_log_handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
        main_log_handler.setFormatter(formatter)
        logging.getLogger('').addHandler(main_log_handler)

        #控制台打印输出日志
        console = logging.StreamHandler()  # 定义一个StreamHandler，将INFO级别或更高的日志信息打印到标准错误，并将其添加到当前的日志处理对象
        console.setLevel(logging.DEBUG)  # 设置要打印日志的等级，低于这一等级，不会打印
        formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
        console.setFormatter(formatter)
        logger.addHandler(console)
        # 进程号

        # 本文件名（不含后缀.py）



        # ========增加代码--结束========


def InitLog(log_path):
    '''

    :param log_dir: logname
    :param log_path: logdir
    :return:
    '''
    if not os.path.isdir(log_path):
        os.makedirs(log_path)
    myfilename = os.path.split(__file__)[-1].split(".")[0]
    LoggerUtil.outputlog(log_path, myfilename)
    # 生成关闭进程的脚本文件
    pid = os.getpid()
    root_path = os.path.dirname(log_path)
    logger.info('root_path={}'.format(root_path))
    LoggerUtil.produce_stop_bat(pid, root_path, myfilename)